/*
 * Automato.h
 *
 *  Created on: 04/10/2012
 *      Author: vagner
 */

#ifndef AUTOMATO_H_
#define AUTOMATO_H_
#include <vector>
#include "Estado.h"
#include "MyMatrix.h"
#include <string>
#include "IOManager.h"


typedef std::vector<Estado> ConjuntoEstados;
typedef std::vector<char> Alfabeto;

class Automato : public IOManager {
protected:
	int numEstados;
	ConjuntoEstados E;
	Alfabeto sigma;
	MyMatrix* tabelaTransicao;
	bool isEstadoInicalDefinido; //Flag para evitar a inclusao de dois estado iniciais
	Automato();//Evitando a chamada do Construtor default.
public:
	Automato(const char* arquivoEntrada);
	//insere um simbolo s no alfabeto
	void insereSimbolo(char& s);
	//Dado um id de um estado e um simbolo retorna o proximo estado
	int funcaoTransicao(int& idEstado, char simbolo) const;
	//Insere uma transição na tabela de transição
	void insereTabelaTransicao(int& estadoOrigem, char& simbolo, int& estadoDestino);
	//Retorna o(s) estado(s) final(is) de um automato
	void getEstadosFinais(std::vector<int>& ListaEstadoFinais) const;
	//Define um estado idEstado como final
	void setEstadoFinal(int& idEstado);
	//Retorna o estado inicial de um automato
	int getEstadoInicial() const;
	//Define um estado do automato com inicial
	void setEstadoInicial(int& idEstado);
	//Verifica se uma palavra w é reconhecida pelo automato. Retorna true em positivo
	bool reconhecePalavra(std::string& w);
	//Retorna o numero de estado de um automato
	int getNumEstados()const;
	//Retorna o simbolo na posicao i do alfabeto
	char getSimbolo(int& i);
	//Verifica se o estado idEstado é inicial;
	bool isEstadoInicial(int& idEstado)const;
	//Verifica se o estado idEstado é final;
	bool isEstadoFinal(int& idEstado) const;
	//Mostra informaçoes sobre um automato
	void show() const;
	//Retorna o alfabeto inteiro de um automato
	std::vector<char>& getAlfabeto();



	inline int getIndexSimbolo(char& simbolo) const;
	virtual ~Automato();
};
#endif /* AUTOMATO_H_ */
